/*
 * IO访问(寄存器 内存)示例
 */
/* C头文件，支持标准C库, 可以跨平台 */
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
/*
 * tests_lib.h包含了测试框架的定义
 * 可以在测例中使用断言(assertion)
 */
#include <tests_lib.h>
/*
 * 访问寄存器/内存，需要引用<io.h>中的定义，用*p方式访问会有跨平台问题
 */
#include <io.h>
/*
 * cache maintenace
 */
#include <arch/cacheflush.h>

static int cache_maint_run(void)
{
    uintptr_t phys_addr = 0x40000000; /* 这个地址只是示意 */
    uint8_t val8;
    uint16_t val16;
    uint32_t val32;

    clean_dcache_range(phys_addr, 0x10000);
    inv_dcache_range(phys_addr, 0x10000);
    flush_dcache_range(phys_addr, 0x10000);

    val8 = 0x12;
    mmio_write_8(phys_addr, val8);
    ASSERT_EQ(val8, mmio_read_8(phys_addr));

    val16 = 0x1234;
    mmio_write_16(phys_addr, val16);
    ASSERT_EQ(val16, mmio_read_16(phys_addr));

    val32 = 0x12345678;
    mmio_write_32(phys_addr, val32);
    ASSERT_EQ(val32, mmio_read_32(phys_addr));

}

DECLARE_TEST_CASE(      /* 声明了一个单元测例, 测试框架会依次调用下面的init(), run(), exit()函数 */
        cache_maint_example,     /* 测例名字，不用带引号"" */
        NULL,           /* 测例预初始化函数，若不需要可以为NULL. 比如可以把复位和时钟初始化放这里 */
        cache_maint_run,         /* 测例执行主体函数，必须定义 */
        NULL            /* 测例退出函数，若不需要可以为NULL. 比如结束测例后需要关时钟 */
);
